// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

'use strict';

lib.rtdep('lib.f', 'lib.Storage');

/**
 * PreferenceManager subclass managing global NaSSH preferences.
 *
 * This is currently just an ordered list of known connection profiles.
 */
hterm.PreferenceManager = function(profileId) {
  lib.PreferenceManager.call(this, hterm.defaultStorage,
                             '/hterm/profiles/' + profileId);
  var defs = hterm.PreferenceManager.defaultPreferences;
  Object.keys(defs).forEach(function(key) {
    this.definePreference(key, defs[key]);
  }.bind(this));
};

hterm.PreferenceManager.defaultPreferences = {
  /**
   * Select an AltGr detection hack^Wheuristic.
   *
   * null: Autodetect based on navigator.language:
   *       'en-us' => 'none', else => 'right-alt'
   * 'none': Disable any AltGr related munging.
   * 'ctrl-alt': Assume Ctrl+Alt means AltGr.
   * 'left-alt': Assume left Alt means AltGr.
   * 'right-alt': Assume right Alt means AltGr.
   */
  'alt-gr-mode': null,

  /**
   * If set, undoes the Chrome OS Alt-Backspace->DEL remap, so that
   * alt-backspace indeed is alt-backspace.
   */
  'alt-backspace-is-meta-backspace': false,

  /**
   * Set whether the alt key acts as a meta key or as a distinct alt key.
   */
  'alt-is-meta': false,

  /**
   * Controls how the alt key is handled.
   *
   *  escape....... Send an ESC prefix.
   *  8-bit........ Add 128 to the unshifted character as in xterm.
   *  browser-key.. Wait for the keypress event and see what the browser says.
   *                (This won't work well on platforms where the browser
   *                 performs a default action for some alt sequences.)
   */
  'alt-sends-what': 'escape',

  /**
   * Terminal bell sound.  Empty string for no audible bell.
   */
  'audible-bell-sound': 'lib-resource:hterm/audio/bell',

  /**
   * If true, terminal bells in the background will create a Web
   * Notification. http://www.w3.org/TR/notifications/
   *
   * Displaying notifications requires permission from the user. When this
   * option is set to true, hterm will attempt to ask the user for permission
   * if necessary. Note browsers may not show this permission request if it
   * did not originate from a user action.
   *
   * Chrome extensions with the "notfications" permission have permission to
   * display notifications.
   */
  'desktop-notification-bell': false,

  /**
   * The background color for text with no other color attributes.
   */
  'background-color': 'rgb(16, 16, 16)',

  /**
   * The background image.
   */
  'background-image': '',

  /**
   * The background image size,
   *
   * Defaults to none.
   */
  'background-size': '',

  /**
   * The background image position,
   *
   * Defaults to none.
   */
  'background-position': '',

  /**
   * If true, the backspace should send BS ('\x08', aka ^H).  Otherwise
   * the backspace key should send '\x7f'.
   */
  'backspace-sends-backspace': false,

  /**
   * Character map overrides.
   *
   * This is specified as an object. It is a sparse array, where each property
   * is the character set code and the value is an object that is a sparse array
   * itself. In that sparse array, each property is the received character and
   * the value is the displayed character.
   *
   * For example:
   *   {"0":{"+":"\u2192",",":"\u2190","-":"\u2191",".":"\u2193","0":"\u2588"}}
   */
  'character-map-overrides': null,

  /**
   * Whether or not to close the window when the command exits.
   */
  'close-on-exit': true,

  /**
   * Whether or not to blink the cursor by default.
   */
  'cursor-blink': false,

  /**
   * The cursor blink rate in milliseconds.
   *
   * A two element array, the first of which is how long the cursor should be
   * on, second is how long it should be off.
   */
  'cursor-blink-cycle': [1000, 500],

  /**
   * The color of the visible cursor.
   */
  'cursor-color': 'rgba(255, 0, 0, 0.5)',

  /**
   * Override colors in the default palette.
   *
   * This can be specified as an array or an object.  If specified as an
   * object it is assumed to be a sparse array, where each property
   * is a numeric index into the color palette.
   *
   * Values can be specified as css almost any css color value.  This
   * includes #RGB, #RRGGBB, rgb(...), rgba(...), and any color names
   * that are also part of the stock X11 rgb.txt file.
   *
   * You can use 'null' to specify that the default value should be not
   * be changed.  This is useful for skipping a small number of indicies
   * when the value is specified as an array.
   */
  'color-palette-overrides': null,

  /**
   * Automatically copy mouse selection to the clipboard.
   */
  'copy-on-select': true,

  /**
   * Whether to use the default window copy behaviour.
   */
  'use-default-window-copy': false,

  /**
   * Whether to clear the selection after copying.
   */
  'clear-selection-after-copy': true,

  /**
   * If true, Ctrl-Plus/Minus/Zero controls zoom.
   * If false, Ctrl-Shift-Plus/Minus/Zero controls zoom, Ctrl-Minus sends ^_,
   * Ctrl-Plus/Zero do nothing.
   */
  'ctrl-plus-minus-zero-zoom': true,

  /**
   * Ctrl+C copies if true, send ^C to host if false.
   * Ctrl+Shift+C sends ^C to host if true, copies if false.
   */
  'ctrl-c-copy': false,

  /**
   * Ctrl+V pastes if true, send ^V to host if false.
   * Ctrl+Shift+V sends ^V to host if true, pastes if false.
   */
  'ctrl-v-paste': false,

  /**
   * Set whether East Asian Ambiguous characters have two column width.
   */
  'east-asian-ambiguous-as-two-column': false,

  /**
   * True to enable 8-bit control characters, false to ignore them.
   *
   * We'll respect the two-byte versions of these control characters
   * regardless of this setting.
   */
  'enable-8-bit-control': false,

  /**
   * True if we should use bold weight font for text with the bold/bright
   * attribute.  False to use the normal weight font.  Null to autodetect.
   */
  'enable-bold': null,

  /**
   * True if we should use bright colors (8-15 on a 16 color palette)
   * for any text with the bold attribute.  False otherwise.
   */
  'enable-bold-as-bright': true,

  /**
   * Allow the host to write directly to the system clipboard.
   */
  'enable-clipboard-notice': true,

  /**
   * Allow the host to write directly to the system clipboard.
   */
  'enable-clipboard-write': true,

  /**
   * Respect the host's attempt to change the cursor blink status using
   * DEC Private Mode 12.
   */
  'enable-dec12': false,

  /**
   * The default environment variables.
   */
  'environment': {'TERM': 'xterm-256color'},

  /**
   * Default font family for the terminal text.
   */
  'font-family': ('"DejaVu Sans Mono", "Everson Mono", ' +
                  'FreeMono, "Menlo", "Terminal", ' +
                  'monospace'),

  /**
   * The default font size in pixels.
   */
  'font-size': 15,

  /**
   * Anti-aliasing.
   */
  'font-smoothing': 'antialiased',

  /**
   * The foreground color for text with no other color attributes.
   */
  'foreground-color': 'rgb(240, 240, 240)',

  /**
   * If true, home/end will control the terminal scrollbar and shift home/end
   * will send the VT keycodes.  If false then home/end sends VT codes and
   * shift home/end scrolls.
   */
  'home-keys-scroll': false,

  /**
   * Max length of a DCS, OSC, PM, or APS sequence before we give up and
   * ignore the code.
   */
  'max-string-sequence': 100000,

  /**
   * If true, convert media keys to their Fkey equivalent. If false, let
   * Chrome handle the keys.
   */
  'media-keys-are-fkeys': false,

  /**
   * Set whether the meta key sends a leading escape or not.
   */
  'meta-sends-escape': true,

  /**
   * Mouse paste button, or null to autodetect.
   *
   * For autodetect, we'll try to enable middle button paste for non-X11
   * platforms.
   *
   * On X11 we move it to button 3, but that'll probably be a context menu
   * in the future.
   */
  'mouse-paste-button': null,

  /**
   * If true, page up/down will control the terminal scrollbar and shift
   * page up/down will send the VT keycodes.  If false then page up/down
   * sends VT codes and shift page up/down scrolls.
   */
  'page-keys-scroll': false,

  /**
   * Set whether we should pass Alt-1..9 to the browser.
   *
   * This is handy when running hterm in a browser tab, so that you don't lose
   * Chrome's "switch to tab" keyboard accelerators.  When not running in a
   * tab it's better to send these keys to the host so they can be used in
   * vim or emacs.
   *
   * If true, Alt-1..9 will be handled by the browser.  If false, Alt-1..9
   * will be sent to the host.  If null, autodetect based on browser platform
   * and window type.
   */
  'pass-alt-number': null,

  /**
   * Set whether we should pass Ctrl-1..9 to the browser.
   *
   * This is handy when running hterm in a browser tab, so that you don't lose
   * Chrome's "switch to tab" keyboard accelerators.  When not running in a
   * tab it's better to send these keys to the host so they can be used in
   * vim or emacs.
   *
   * If true, Ctrl-1..9 will be handled by the browser.  If false, Ctrl-1..9
   * will be sent to the host.  If null, autodetect based on browser platform
   * and window type.
   */
  'pass-ctrl-number': null,

  /**
   * Set whether we should pass Meta-1..9 to the browser.
   *
   * This is handy when running hterm in a browser tab, so that you don't lose
   * Chrome's "switch to tab" keyboard accelerators.  When not running in a
   * tab it's better to send these keys to the host so they can be used in
   * vim or emacs.
   *
   * If true, Meta-1..9 will be handled by the browser.  If false, Meta-1..9
   * will be sent to the host.  If null, autodetect based on browser platform
   * and window type.
   */
  'pass-meta-number': null,

  /**
   * Set whether meta-V gets passed to host.
   */
  'pass-meta-v': true,

  /**
   * Set the expected encoding for data received from the host.
   *
   * Valid values are 'utf-8' and 'raw'.
   */
  'receive-encoding': 'utf-8',

  /**
   * If true, scroll to the bottom on any keystroke.
   */
  'scroll-on-keystroke': true,

  /**
   * If true, scroll to the bottom on terminal output.
   */
  'scroll-on-output': false,

  /**
   * The vertical scrollbar mode.
   */
  'scrollbar-visible': true,

  /**
   * The multiplier for the pixel delta in mousewheel event caused by the scroll
   * wheel. Alters how fast the page scrolls.
   */
  'scroll-wheel-move-multiplier': 1,

  /**
   * Set the encoding for data sent to host.
   *
   * Valid values are 'utf-8' and 'raw'.
   */
  'send-encoding': 'utf-8',

  /**
   * Shift + Insert pastes if true, sent to host if false.
   */
  'shift-insert-paste': true,

  /**
   * User stylesheet to include in the terminal document.
   */
  'user-css': ''
};

hterm.PreferenceManager.prototype = {
  __proto__: lib.PreferenceManager.prototype
};
